package com.nantian.common.secret.symmetric;

import com.nantian.common.serenum.AlgorithmMode;
import com.nantian.common.serenum.Padding;
import com.nantian.common.util.StringUtils;
import com.nantian.constant.SecretConsts;
import org.apache.commons.codec.CharEncoding;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.security.Security;
/**
 * <p>ClassName: DesUtils</p >
 * <p>Description: DES、3DES加解密工具</p >
 * <p>Copyright: Copyright@2014</p >
 * <p>Company: 广州南天电脑系统有限公司</p >
 * <p>Date: 2020-12-31</p >
 *
 * @author 鄢诚
 * @version 1.0
 */
public class DesUtils {
    /**
     *
     */
    private static final int DES3_MINLENGTH = 24;
    static {
        //如果是PKCS7Padding填充方式，则必须加上下面这行
        Security.addProvider(new BouncyCastleProvider());
    }
    static {
        try {
            RemoveCryptographyRestrictions.init();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private DesUtils(){

    }
    /**
     * DES/CBC加密模式
     * @param data 原文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 密文
     */
    public static String encryptCbc(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.CBC, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * 3DES/CBC加密模式
     * @param data 原文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 密文
     */
    public static String encrypt3DesCbc(String data, String password, String iv, Padding padding) {
        if(StringUtils.isBlank(password) || password.length() < DES3_MINLENGTH){
            throw new IllegalArgumentException("3DES加密密钥长度不能少于24位");
        }
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.CBC, padding, iv, CharEncoding.UTF_8);
    }

    /**
     * DES/CBC解密模式
     * @param data 密文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 明文
     */
    public static String decryptCbc(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.CBC, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * DES/CBC解密模式
     * @param data 密文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 明文
     */
    public static String decrypt3DesCbc(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.CBC, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * DES/CFB加密模式
     * @param data 原文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 密文
     */
    public static String encryptCfb(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.CFB, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * 3DES/CFB加密模式
     * @param data 原文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 密文
     */
    public static String encrypt3DesCfb(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.CFB, padding, iv, CharEncoding.UTF_8);
    }

    /**
     * DES/CFB解密模式
     * @param data 密文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 明文
     */
    public static String decryptCfb(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.CFB, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * 3DES/CFB解密模式
     * @param data 密文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 明文
     */
    public static String decrypt3DesCfb(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.CFB, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * DES/OFB加密模式
     * @param data 原文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 密文
     */
    public static String encryptOfb(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.OFB, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * 3DES/OFB加密模式
     * @param data 原文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 密文
     */
    public static String encrypt3DesOfb(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.OFB, padding, iv, CharEncoding.UTF_8);
    }

    /**
     * DES/OFB解密模式
     * @param data 密文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 明文
     */
    public static String decryptOfb(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.OFB, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * 3DES/OFB解密模式
     * @param data 密文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 明文
     */
    public static String decrypt3DesOfb(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.OFB, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * DES/CTR加密模式
     * @param data 原文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 密文
     */
    public static String encryptCtr(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.CTR, padding, iv, CharEncoding.UTF_8);
    }
    /**
     * 3DES/CTR加密模式
     * @param data 原文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 密文
     */
    public static String encrypt3DesCtr(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.CTR, padding, iv, CharEncoding.UTF_8);
    }

    /**
     * DES/CTR解密模式
     * @param data 密文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 明文
     */
    public static String decryptCtr(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.CTR, padding, iv, CharEncoding.UTF_8);
    }

    /**
     * 3DES/CTR解密模式
     * @param data 密文
     * @param password 密钥
     * @param iv 偏移量
     * @param padding 填充模式
     * @return 明文
     */
    public static String decrypt3DesCtr(String data, String password, String iv, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.CTR, padding, iv, CharEncoding.UTF_8);
    }

    /**
     * DES/ECB加密模式
     * @param data 原文
     * @param password 密钥
     * @param padding 填充模式
     * @return 密文
     */
    public static String encryptEcb(String data, String password, Padding padding) {
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.ECB, padding, null, CharEncoding.UTF_8);
    }
    /**
     * 3DES/ECB加密模式
     * @param data 原文
     * @param password 密钥
     * @param padding 填充模式
     * @return 密文
     */
    public static String encrypt3DesEcb(String data, String password, Padding padding) {
        return SymmetricEncryptUtils.encrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.ECB, padding, null, CharEncoding.UTF_8);
    }

    /**
     * DES/ECB解密模式
     * @param data 密文
     * @param password 密钥
     * @param padding 填充模式
     * @return 明文
     */
    public static String decryptEcb(String data, String password, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES_KEY_ALGORITHM, AlgorithmMode.ECB, padding, null, CharEncoding.UTF_8);
    }
    /**
     * 3DES/ECB解密模式
     * @param data 密文
     * @param password 密钥
     * @param padding 填充模式
     * @return 明文
     */
    public static String decrypt3DesEcb(String data, String password, Padding padding) {
        return SymmetricEncryptUtils.decrypt(data, password, SecretConsts.DES3_KEY_ALGORITHM, AlgorithmMode.ECB, padding, null, CharEncoding.UTF_8);
    }

}